$(function () {

  // init date tables
  var jobTable = $("#job_list").dataTable({
    "deferRender": true,
    "processing": true,
    "serverSide": true,
    "ajax": {
      url: base_url + "/jobinfo/pageList",
      type: "post",
      data: function (d) {
        var obj = {};
        obj.jobGroup = $('#jobGroup').val();
        obj.triggerStatus = $('#triggerStatus').val();
        obj.jobDesc = $('#jobDesc').val();
        obj.executorHandler = $('#executorHandler').val();
        obj.author = $('#author').val();
        obj.start = d.start;
        obj.length = d.length;
        return obj;
      }
    },
    "searching": false,
    "ordering": false,
    //"scrollX": true,	// scroll x，close self-adaption
    "columns": [
      {
        "data": 'id',
        "bSortable": false,
        "visible": true,
        "width": '7%'
      },
      {
        "data": 'jobGroup',
        "visible": false,
        "render": function (data, type, row) {
          var groupMenu = $("#jobGroup").find("option");
          for (var index in $("#jobGroup").find("option")) {
            if ($(groupMenu[index]).attr('value') == data) {
              return $(groupMenu[index]).html();
            }
          }
          return data;
        }
      },
      {
        "data": 'jobDesc',
        "visible": true,
        "width": '25%'
      },
      {
        "data": 'scheduleType',
        "visible": true,
        "width": '13%',
        "render": function (data, type, row) {
          if (row.scheduleConf) {
            return row.scheduleType + '：' + row.scheduleConf;
          } else {
            return row.scheduleType;
          }
        }
      },
      {
        "data": 'glueType',
        "width": '25%',
        "visible": true,
        "render": function (data, type, row) {
          var glueTypeTitle = findGlueTypeTitle(row.glueType);
          if (row.executorHandler) {
            return glueTypeTitle + "：" + row.executorHandler;
          } else {
            return glueTypeTitle;
          }
        }
      },
      {"data": 'executorParam', "visible": false},
      {
        "data": 'addTime',
        "visible": false,
        "render": function (data, type, row) {
          return data ? moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss")
              : "";
        }
      },
      {
        "data": 'updateTime',
        "visible": false,
        "render": function (data, type, row) {
          return data ? moment(new Date(data)).format("YYYY-MM-DD HH:mm:ss")
              : "";
        }
      },
      {"data": 'author', "visible": true, "width": '10%'},
      {"data": 'alarmEmail', "visible": false},
      {
        "data": 'triggerStatus',
        "width": '10%',
        "visible": true,
        "render": function (data, type, row) {
          // status
          if (1 == data) {
            return '<small class="label label-success" >RUNNING</small>';
          } else {
            return '<small class="label label-default" >STOP</small>';
          }
          return data;
        }
      },
      {
        "data": I18n.system_opt,
        "width": '10%',
        "render": function (data, type, row) {
          return function () {

            // status
            var start_stop_div = "";
            if (1 == row.triggerStatus) {
              start_stop_div = '<li><a href="javascript:void(0);" class="job_operate" _type="job_pause" >'
                  + I18n.jobinfo_opt_stop + '</a></li>\n';
            } else {
              start_stop_div = '<li><a href="javascript:void(0);" class="job_operate" _type="job_resume" >'
                  + I18n.jobinfo_opt_start + '</a></li>\n';
            }

            // job_next_time_html
            var job_next_time_html = '';
            if (row.scheduleType == 'CRON' || row.scheduleType == 'FIX_RATE') {
              job_next_time_html = '<li><a href="javascript:void(0);" class="job_next_time" >'
                  + I18n.jobinfo_opt_next_time + '</a></li>\n';
            }

            // log url
            var logHref = base_url + '/joblog?jobId=' + row.id;

            // code url
            var codeBtn = "";
            if ('BEAN' != row.glueType) {
              var codeUrl = base_url + '/jobcode?jobId=' + row.id;
              codeBtn = '<li><a href="' + codeUrl
                  + '" target="_blank" >GLUE IDE</a></li>\n';
              codeBtn += '<li class="divider"></li>\n';
            }

            // data
            tableData['key' + row.id] = row;

            // opt
            var html = '<div class="btn-group">\n' +
                '     <button type="button" class="btn btn-primary btn-sm">'
                + I18n.system_opt + '</button>\n' +
                '     <button type="button" class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown">\n'
                +
                '       <span class="caret"></span>\n' +
                '       <span class="sr-only">Toggle Dropdown</span>\n' +
                '     </button>\n' +
                '     <ul class="dropdown-menu" role="menu" _id="' + row.id
                + '" >\n' +
                '       <li><a href="javascript:void(0);" class="job_trigger" >'
                + I18n.jobinfo_opt_run + '</a></li>\n' +
                '       <li><a href="' + logHref + '">' + I18n.jobinfo_opt_log
                + '</a></li>\n' +
                '       <li><a href="javascript:void(0);" class="job_registryinfo" >'
                + I18n.jobinfo_opt_registryinfo + '</a></li>\n' +
                job_next_time_html +
                '       <li class="divider"></li>\n' +
                codeBtn +
                start_stop_div +
                '       <li><a href="javascript:void(0);" class="update" >'
                + I18n.system_opt_edit + '</a></li>\n' +
                '       <li><a href="javascript:void(0);" class="job_operate" _type="job_del" >'
                + I18n.system_opt_del + '</a></li>\n' +
                '       <li><a href="javascript:void(0);" class="job_copy" >'
                + I18n.system_opt_copy + '</a></li>\n' +
                '     </ul>\n' +
                '   </div>';

            return html;
          };
        }
      }
    ],
    "language": {
      "sProcessing": I18n.dataTable_sProcessing,
      "sLengthMenu": I18n.dataTable_sLengthMenu,
      "sZeroRecords": I18n.dataTable_sZeroRecords,
      "sInfo": I18n.dataTable_sInfo,
      "sInfoEmpty": I18n.dataTable_sInfoEmpty,
      "sInfoFiltered": I18n.dataTable_sInfoFiltered,
      "sInfoPostFix": "",
      "sSearch": I18n.dataTable_sSearch,
      "sUrl": "",
      "sEmptyTable": I18n.dataTable_sEmptyTable,
      "sLoadingRecords": I18n.dataTable_sLoadingRecords,
      "sInfoThousands": ",",
      "oPaginate": {
        "sFirst": I18n.dataTable_sFirst,
        "sPrevious": I18n.dataTable_sPrevious,
        "sNext": I18n.dataTable_sNext,
        "sLast": I18n.dataTable_sLast
      },
      "oAria": {
        "sSortAscending": I18n.dataTable_sSortAscending,
        "sSortDescending": I18n.dataTable_sSortDescending
      }
    }
  });

  // table data
  var tableData = {};

  // search btn
  $('#searchBtn').on('click', function () {
    jobTable.fnDraw();
  });

  // jobGroup change
  $('#jobGroup').on('change', function () {
    //reload
    var jobGroup = $('#jobGroup').val();
    window.location.href = base_url + "/jobinfo?jobGroup=" + jobGroup;
  });

  // job operate
  $("#job_list").on('click', '.job_operate', function () {
    var typeName;
    var url;
    var needFresh = false;

    var type = $(this).attr("_type");
    if ("job_pause" == type) {
      typeName = I18n.jobinfo_opt_stop;
      url = base_url + "/jobinfo/stop";
      needFresh = true;
    } else if ("job_resume" == type) {
      typeName = I18n.jobinfo_opt_start;
      url = base_url + "/jobinfo/start";
      needFresh = true;
    } else if ("job_del" == type) {
      typeName = I18n.system_opt_del;
      url = base_url + "/jobinfo/remove";
      needFresh = true;
    } else {
      return;
    }

    var id = $(this).parents('ul').attr("_id");

    layer.confirm(I18n.system_ok + typeName + '?', {
      icon: 3,
      title: I18n.system_tips,
      btn: [I18n.system_ok, I18n.system_cancel]
    }, function (index) {
      layer.close(index);

      $.ajax({
        type: 'POST',
        url: url,
        data: {
          "id": id
        },
        dataType: "json",
        success: function (data) {
          if (data.code == 200) {
            layer.msg(typeName + I18n.system_success);
            if (needFresh) {
              //window.location.reload();
              jobTable.fnDraw(false);
            }
          } else {
            layer.msg(data.msg || typeName + I18n.system_fail);
          }
        }
      });
    });
  });

  // job trigger
  $("#job_list").on('click', '.job_trigger', function () {
    var id = $(this).parents('ul').attr("_id");
    var row = tableData['key' + id];

    $("#jobTriggerModal .form input[name='id']").val(row.id);
    $("#jobTriggerModal .form textarea[name='executorParam']").val(
        row.executorParam);

    $('#jobTriggerModal').modal({backdrop: false, keyboard: false}).modal(
        'show');
  });
  $("#jobTriggerModal .ok").on('click', function () {
    $.ajax({
      type: 'POST',
      url: base_url + "/jobinfo/trigger",
      data: {
        "id": $("#jobTriggerModal .form input[name='id']").val(),
        "executorParam": $(
            "#jobTriggerModal .textarea[name='executorParam']").val(),
        "addressList": $("#jobTriggerModal .textarea[name='addressList']").val()
      },
      dataType: "json",
      success: function (data) {
        if (data.code == 200) {
          $('#jobTriggerModal').modal('hide');

          layer.msg(I18n.jobinfo_opt_run + I18n.system_success);
        } else {
          layer.msg(data.msg || I18n.jobinfo_opt_run + I18n.system_fail);
        }
      }
    });
  });
  $("#jobTriggerModal").on('hide.bs.modal', function () {
    $("#jobTriggerModal .form")[0].reset();
  });

  // job registryinfo
  $("#job_list").on('click', '.job_registryinfo', function () {
    var id = $(this).parents('ul').attr("_id");
    var row = tableData['key' + id];

    var jobGroup = row.jobGroup;

    $.ajax({
      type: 'POST',
      url: base_url + "/jobgroup/loadById",
      data: {
        "id": jobGroup
      },
      dataType: "json",
      success: function (data) {

        var html = '<div>';
        if (data.code == 200 && data.content.registryList) {
          for (var index in data.content.registryList) {
            html += (parseInt(index) + 1) + '. <span class="badge bg-green" >'
                + data.content.registryList[index] + '</span><br>';
          }
        }
        html += '</div>';

        layer.open({
          title: I18n.jobinfo_opt_registryinfo,
          btn: [I18n.system_ok],
          content: html
        });

      }
    });

  });

  // job_next_time
  $("#job_list").on('click', '.job_next_time', function () {
    var id = $(this).parents('ul').attr("_id");
    var row = tableData['key' + id];

    $.ajax({
      type: 'POST',
      url: base_url + "/jobinfo/nextTriggerTime",
      data: {
        "scheduleType": row.scheduleType,
        "scheduleConf": row.scheduleConf
      },
      dataType: "json",
      success: function (data) {

        if (data.code != 200) {
          layer.open({
            title: I18n.jobinfo_opt_next_time,
            btn: [I18n.system_ok],
            content: data.msg
          });
        } else {
          var html = '<center>';
          if (data.code == 200 && data.content) {
            for (var index in data.content) {
              html += '<span>' + data.content[index] + '</span><br>';
            }
          }
          html += '</center>';

          layer.open({
            title: I18n.jobinfo_opt_next_time,
            btn: [I18n.system_ok],
            content: html
          });
        }

      }
    });

  });

  // add
  $(".add").click(function () {

    // init-cronGen
    $("#addModal .form input[name='schedule_conf_CRON']").show().siblings().remove();
    $("#addModal .form input[name='schedule_conf_CRON']").cronGen({});

    // 》init scheduleType
    $("#updateModal .form select[name=scheduleType]").change();

    // 》init glueType
    $("#updateModal .form select[name=glueType]").change();

    $('#addModal').modal({backdrop: false, keyboard: false}).modal('show');
  });
  var addModalValidate = $("#addModal .form").validate({
    errorElement: 'span',
    errorClass: 'help-block',
    focusInvalid: true,
    rules: {
      jobDesc: {
        required: true,
        maxlength: 50
      },
      author: {
        required: true
      }/*,
            executorTimeout : {
                digits:true
            },
            executorFailRetryCount : {
                digits:true
            }*/
    },
    messages: {
      jobDesc: {
        required: I18n.system_please_input + I18n.jobinfo_field_jobdesc
      },
      author: {
        required: I18n.system_please_input + I18n.jobinfo_field_author
      }/*,
            executorTimeout : {
                digits: I18n.system_please_input + I18n.system_digits
            },
            executorFailRetryCount : {
                digits: I18n.system_please_input + I18n.system_digits
            }*/
    },
    highlight: function (element) {
      $(element).closest('.form-group').addClass('has-error');
    },
    success: function (label) {
      label.closest('.form-group').removeClass('has-error');
      label.remove();
    },
    errorPlacement: function (error, element) {
      element.parent('div').append(error);
    },
    submitHandler: function (form) {

      // process executorTimeout+executorFailRetryCount
      var executorTimeout = $(
          "#addModal .form input[name='executorTimeout']").val();
      if (!/^\d+$/.test(executorTimeout)) {
        executorTimeout = 0;
      }
      $("#addModal .form input[name='executorTimeout']").val(executorTimeout);
      var executorFailRetryCount = $(
          "#addModal .form input[name='executorFailRetryCount']").val();
      if (!/^\d+$/.test(executorFailRetryCount)) {
        executorFailRetryCount = 0;
      }
      $("#addModal .form input[name='executorFailRetryCount']").val(
          executorFailRetryCount);

      // process schedule_conf
      var scheduleType = $("#addModal .form select[name='scheduleType']").val();
      var scheduleConf;
      if (scheduleType == 'CRON') {
        scheduleConf = $("#addModal .form input[name='cronGen_display']").val();
      } else if (scheduleType == 'FIX_RATE') {
        scheduleConf = $(
            "#addModal .form input[name='schedule_conf_FIX_RATE']").val();
      } else if (scheduleType == 'FIX_DELAY') {
        scheduleConf = $(
            "#addModal .form input[name='schedule_conf_FIX_DELAY']").val();
      }
      $("#addModal .form input[name='scheduleConf']").val(scheduleConf);

      $.post(base_url + "/jobinfo/add", $("#addModal .form").serialize(),
          function (data, status) {
            if (data.code == "200") {
              $('#addModal').modal('hide');
              layer.open({
                title: I18n.system_tips,
                btn: [I18n.system_ok],
                content: I18n.system_add_suc,
                icon: '1',
                end: function (layero, index) {
                  jobTable.fnDraw();
                  //window.location.reload();
                }
              });
            } else {
              layer.open({
                title: I18n.system_tips,
                btn: [I18n.system_ok],
                content: (data.msg || I18n.system_add_fail),
                icon: '2'
              });
            }
          });
    }
  });
  $("#addModal").on('hide.bs.modal', function () {
    addModalValidate.resetForm();
    $("#addModal .form")[0].reset();
    $("#addModal .form .form-group").removeClass("has-error");
    $(".remote_panel").show();	// remote

    $("#addModal .form input[name='executorHandler']").removeAttr("readonly");
  });

  // scheduleType change
  $(".scheduleType").change(function () {
    var scheduleType = $(this).val();
    $(this).parents("form").find(".schedule_conf").hide();
    $(this).parents("form").find(".schedule_conf_" + scheduleType).show();

  });

  // glueType change
  $(".glueType").change(function () {
    // executorHandler
    var $executorHandler = $(this).parents("form").find(
        "input[name='executorHandler']");
    var glueType = $(this).val();
    if ('BEAN' != glueType) {
      $executorHandler.val("");
      $executorHandler.attr("readonly", "readonly");
    } else {
      $executorHandler.removeAttr("readonly");
    }
  });

  $("#addModal .glueType").change(function () {
    // glueSource
    var glueType = $(this).val();
    if ('GLUE_GROOVY' == glueType) {
      $("#addModal .form textarea[name='glueSource']").val(
          $("#addModal .form .glueSource_java").val());
    } else if ('GLUE_SHELL' == glueType) {
      $("#addModal .form textarea[name='glueSource']").val(
          $("#addModal .form .glueSource_shell").val());
    } else if ('GLUE_PYTHON' == glueType) {
      $("#addModal .form textarea[name='glueSource']").val(
          $("#addModal .form .glueSource_python").val());
    } else if ('GLUE_PHP' == glueType) {
      $("#addModal .form textarea[name='glueSource']").val(
          $("#addModal .form .glueSource_php").val());
    } else if ('GLUE_NODEJS' == glueType) {
      $("#addModal .form textarea[name='glueSource']").val(
          $("#addModal .form .glueSource_nodejs").val());
    } else if ('GLUE_POWERSHELL' == glueType) {
      $("#addModal .form textarea[name='glueSource']").val(
          $("#addModal .form .glueSource_powershell").val());
    } else {
      $("#addModal .form textarea[name='glueSource']").val("");
    }
  });

  // update
  $("#job_list").on('click', '.update', function () {

    var id = $(this).parents('ul').attr("_id");
    var row = tableData['key' + id];

    // fill base
    $("#updateModal .form input[name='id']").val(row.id);
    $('#updateModal .form select[name=jobGroup] option[value=' + row.jobGroup
        + ']').prop('selected', true);
    $("#updateModal .form input[name='jobDesc']").val(row.jobDesc);
    $("#updateModal .form input[name='author']").val(row.author);
    $("#updateModal .form input[name='alarmEmail']").val(row.alarmEmail);

    // fill trigger
    $('#updateModal .form select[name=scheduleType] option[value='
        + row.scheduleType + ']').prop('selected', true);
    $("#updateModal .form input[name='scheduleConf']").val(row.scheduleConf);
    if (row.scheduleType == 'CRON') {
      $("#updateModal .form input[name='schedule_conf_CRON']").val(
          row.scheduleConf);
    } else if (row.scheduleType == 'FIX_RATE') {
      $("#updateModal .form input[name='schedule_conf_FIX_RATE']").val(
          row.scheduleConf);
    } else if (row.scheduleType == 'FIX_DELAY') {
      $("#updateModal .form input[name='schedule_conf_FIX_DELAY']").val(
          row.scheduleConf);
    }

    // 》init scheduleType
    $("#updateModal .form select[name=scheduleType]").change();

    // fill job
    $('#updateModal .form select[name=glueType] option[value=' + row.glueType
        + ']').prop('selected', true);
    $("#updateModal .form input[name='executorHandler']").val(
        row.executorHandler);
    $("#updateModal .form textarea[name='executorParam']").val(
        row.executorParam);

    // 》init glueType
    $("#updateModal .form select[name=glueType]").change();

    // 》init-cronGen
    $("#updateModal .form input[name='schedule_conf_CRON']").show().siblings().remove();
    $("#updateModal .form input[name='schedule_conf_CRON']").cronGen({});

    // fill advanced
    $('#updateModal .form select[name=executorRouteStrategy] option[value='
        + row.executorRouteStrategy + ']').prop('selected', true);
    $("#updateModal .form input[name='childJobId']").val(row.childJobId);
    $('#updateModal .form select[name=misfireStrategy] option[value='
        + row.misfireStrategy + ']').prop('selected', true);
    $('#updateModal .form select[name=executorBlockStrategy] option[value='
        + row.executorBlockStrategy + ']').prop('selected', true);
    $("#updateModal .form input[name='executorTimeout']").val(
        row.executorTimeout);
    $("#updateModal .form input[name='executorFailRetryCount']").val(
        row.executorFailRetryCount);

    // show
    $('#updateModal').modal({backdrop: false, keyboard: false}).modal('show');
  });
  var updateModalValidate = $("#updateModal .form").validate({
    errorElement: 'span',
    errorClass: 'help-block',
    focusInvalid: true,

    rules: {
      jobDesc: {
        required: true,
        maxlength: 50
      },
      author: {
        required: true
      }
    },
    messages: {
      jobDesc: {
        required: I18n.system_please_input + I18n.jobinfo_field_jobdesc
      },
      author: {
        required: I18n.system_please_input + I18n.jobinfo_field_author
      }
    },
    highlight: function (element) {
      $(element).closest('.form-group').addClass('has-error');
    },
    success: function (label) {
      label.closest('.form-group').removeClass('has-error');
      label.remove();
    },
    errorPlacement: function (error, element) {
      element.parent('div').append(error);
    },
    submitHandler: function (form) {

      // process executorTimeout + executorFailRetryCount
      var executorTimeout = $(
          "#updateModal .form input[name='executorTimeout']").val();
      if (!/^\d+$/.test(executorTimeout)) {
        executorTimeout = 0;
      }
      $("#updateModal .form input[name='executorTimeout']").val(
          executorTimeout);
      var executorFailRetryCount = $(
          "#updateModal .form input[name='executorFailRetryCount']").val();
      if (!/^\d+$/.test(executorFailRetryCount)) {
        executorFailRetryCount = 0;
      }
      $("#updateModal .form input[name='executorFailRetryCount']").val(
          executorFailRetryCount);

      // process schedule_conf
      var scheduleType = $(
          "#updateModal .form select[name='scheduleType']").val();
      var scheduleConf;
      if (scheduleType == 'CRON') {
        scheduleConf = $(
            "#updateModal .form input[name='cronGen_display']").val();
      } else if (scheduleType == 'FIX_RATE') {
        scheduleConf = $(
            "#updateModal .form input[name='schedule_conf_FIX_RATE']").val();
      } else if (scheduleType == 'FIX_DELAY') {
        scheduleConf = $(
            "#updateModal .form input[name='schedule_conf_FIX_DELAY']").val();
      }
      $("#updateModal .form input[name='scheduleConf']").val(scheduleConf);

      // post
      $.post(base_url + "/jobinfo/update", $("#updateModal .form").serialize(),
          function (data, status) {
            if (data.code == "200") {
              $('#updateModal').modal('hide');
              layer.open({
                title: I18n.system_tips,
                btn: [I18n.system_ok],
                content: I18n.system_update_suc,
                icon: '1',
                end: function (layero, index) {
                  //window.location.reload();
                  jobTable.fnDraw();
                }
              });
            } else {
              layer.open({
                title: I18n.system_tips,
                btn: [I18n.system_ok],
                content: (data.msg || I18n.system_update_fail),
                icon: '2'
              });
            }
          });
    }
  });
  $("#updateModal").on('hide.bs.modal', function () {
    updateModalValidate.resetForm();
    $("#updateModal .form")[0].reset();
    $("#updateModal .form .form-group").removeClass("has-error");
  });

  /**
   * find title by name, GlueType
   */
  function findGlueTypeTitle(glueType) {
    var glueTypeTitle;
    $("#addModal .form select[name=glueType] option").each(function () {
      var name = $(this).val();
      var title = $(this).text();
      if (glueType == name) {
        glueTypeTitle = title;
        return false
      }
    });
    return glueTypeTitle;
  }

  // job_copy
  $("#job_list").on('click', '.job_copy', function () {

    var id = $(this).parents('ul').attr("_id");
    var row = tableData['key' + id];

    // fill base
    $('#addModal .form select[name=jobGroup] option[value=' + row.jobGroup
        + ']').prop('selected', true);
    $("#addModal .form input[name='jobDesc']").val(row.jobDesc);
    $("#addModal .form input[name='author']").val(row.author);
    $("#addModal .form input[name='alarmEmail']").val(row.alarmEmail);

    // fill trigger
    $('#addModal .form select[name=scheduleType] option[value='
        + row.scheduleType + ']').prop('selected', true);
    $("#addModal .form input[name='scheduleConf']").val(row.scheduleConf);
    if (row.scheduleType == 'CRON') {
      $("#addModal .form input[name='schedule_conf_CRON']").val(
          row.scheduleConf);
    } else if (row.scheduleType == 'FIX_RATE') {
      $("#addModal .form input[name='schedule_conf_FIX_RATE']").val(
          row.scheduleConf);
    } else if (row.scheduleType == 'FIX_DELAY') {
      $("#addModal .form input[name='schedule_conf_FIX_DELAY']").val(
          row.scheduleConf);
    }

    // 》init scheduleType
    $("#addModal .form select[name=scheduleType]").change();

    // fill job
    $('#addModal .form select[name=glueType] option[value=' + row.glueType
        + ']').prop('selected', true);
    $("#addModal .form input[name='executorHandler']").val(row.executorHandler);
    $("#addModal .form textarea[name='executorParam']").val(row.executorParam);

    // 》init glueType
    $("#addModal .form select[name=glueType]").change();

    // 》init-cronGen
    $("#addModal .form input[name='schedule_conf_CRON']").show().siblings().remove();
    $("#addModal .form input[name='schedule_conf_CRON']").cronGen({});

    // fill advanced
    $('#addModal .form select[name=executorRouteStrategy] option[value='
        + row.executorRouteStrategy + ']').prop('selected', true);
    $("#addModal .form input[name='childJobId']").val(row.childJobId);
    $('#addModal .form select[name=misfireStrategy] option[value='
        + row.misfireStrategy + ']').prop('selected', true);
    $('#addModal .form select[name=executorBlockStrategy] option[value='
        + row.executorBlockStrategy + ']').prop('selected', true);
    $("#addModal .form input[name='executorTimeout']").val(row.executorTimeout);
    $("#addModal .form input[name='executorFailRetryCount']").val(
        row.executorFailRetryCount);

    // show
    $('#addModal').modal({backdrop: false, keyboard: false}).modal('show');
  });

});
